package com.cyn.service.impl;

import com.cyn.dao.ProjectMapper;
import com.cyn.dao.SysUserMapper;
import com.cyn.entity.Project;
import com.cyn.entity.SysUser;
import com.cyn.service.TransactionalTestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
public class TransactionalTestServiceImpl implements TransactionalTestService {

    @Autowired
    SysUserMapper sysUserMapper;

    @Autowired
    ProjectMapper projectMapper;
    @Autowired
    private PlatformTransactionManager platformTransactionManager;

    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void test() {
//        SysUser sysUser = new SysUser();
//        sysUser.setLoginName("123");
//        sysUserMapper.insert(sysUser);
        int i=1/0;
        // 手动开启事务
//        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
//        //新发起一个事务
//        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
//        TransactionStatus transaction = platformTransactionManager.getTransaction(def);
//        try {
//
//        }catch (Exception e){
//            platformTransactionManager.rollback(transaction);
//            throw e;
//        }
//
//        platformTransactionManager.commit(transaction);
    }

    /**
     * 同类中在方法a中调用b
     * a没有事务，b有 ，异常发生在b中 不会回滚
     */
    public void a1(){
        a();
    }

    private void a() {
        SysUser sysUser = new SysUser();
        sysUser.setUserName("1");
        sysUser.setLoginName("2");
        sysUserMapper.insert(sysUser);
        b();
    }

    @Transactional
    void b(){
        Project project = new Project();
        project.setTitle("123");
        projectMapper.insert(project);
        int i = 1/0;
    }

    /**
     * 同类中在方法a中调用b
     * a没有事务，b有 ，异常发生在a中 不会回滚
     */
    public void a2(){

    }
    /**
     * 同类中在方法a中调用b
     * a有事务，b没有 ，异常发生在b中 会回滚
     */
    public void a3(){

    }
    /**
     * 同类中在方法a中调用b
     * a有事务，b没有 ，异常发生在a中 会回滚
     */
    public void a4(){

    }
    /**
     * 同类中在方法a中调用b
     * a有事务，b也有 ，异常发生在b中 会回滚
     */
    public void a5(){

    }
    /**
     * 同类中在方法a中调用b
     * a有事务，b也有 ，异常发生在a中 会回滚
     */
    public void a6(){

    }


    /**
     *a类中调用b类中的方法
     * a中有事务，b中也有 会回滚
     *
     */
    public  void b5(){

    }

    /**
     *a类中调用b类中的方法
     * a中有事务，b中没有 会回滚
     *
     */
    public  void b6(){

    }

    /**
     *a类中调用b类中的方法
     * a没有事务，b中有 不会回滚
     *
     */
    public  void b7(){

    }

    /**
     *a类中调用b类中的方法
     * a没有事务，b中没有 不会回滚
     *
     */
    public  void b8(){

    }

}
